// 字面量
let a: 10
console.log(a)
// a = 20 不能修改

// 字面量约束
let b: 'male' | 'female'
// b = 'abc' // 字面量约束
b = 'male'

// 变量限制类型
let c: string | boolean | number
c = 'abc'
c = false
c = 123

// 任意类型: 关闭了ts类型检测
let d: any
d = 1
d = false

// let e; // ts 文件中隐式any类型,

let e: unknown // 未知类型的值, 实际理解: 类型安全的 any, tsc会阻止赋值
e = 'abc'
e = 123
e = false
e = 'xxx'

let s: string
// s = e // error   未知类型不能知己给 string 类型变量
s = d // any -> string, 修改了 s 的类型, 危险操作
if (typeof e === 'string') {
    s = e // 转换赋值
}

// 类型断言: 告诉tsc e其实是个string类型
s = e as string // 类型断言

s = <string>e  // 类型断言

// void     空值
// never    没有值: 永远不会返回结果
function fn(): void {
    // return false
    // return undefined
}

// void he1
function fn2():never {
    throw new Error('error occurred')
}



